//
// Created on 2025/9/23.
//
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
// please include "napi/native_api.h".

#ifndef OHOS_AVRO_AVRO_COMPAREBUFFERS_H
#define OHOS_AVRO_AVRO_COMPAREBUFFERS_H
#include <cstdint>
#include <cstring>
#include <stdexcept>

// 自定义缓冲区类，模拟 Node.js Buffer
class Buffer {
private:
    uint8_t* data_;       // 指向原始数据的指针（可能是共享的）
    size_t offset_;       // 子缓冲区在原始数据中的起始偏移量
    size_t length_;       // 子缓冲区的长度
    int* ref_count_;      // 引用计数（管理内存生命周期）
    bool is_owner_;       // 是否是原始数据的所有者（负责释放内存）

public:
    // 构造函数：创建新缓冲区（分配内存）
    Buffer(size_t length) 
        : offset_(0), length_(length), is_owner_(true) {
        data_ = new uint8_t[length];
        ref_count_ = new int(1); // 初始引用计数为 1
    }

    // 私有构造函数：创建子缓冲区视图（不分配内存，共享数据）
    Buffer(uint8_t* data, size_t offset, size_t length, int* ref_count)
        : data_(data), offset_(offset), length_(length), 
          ref_count_(ref_count), is_owner_(false) {
        (*ref_count_)++; // 引用计数 +1
    }

    // 析构函数：释放内存（仅当引用计数为 0 且是所有者时）
    ~Buffer() {
        if (is_owner_) {
            (*ref_count_)--;
            if (*ref_count_ == 0) {
                delete[] data_;
                delete ref_count_;
            }
        }
    }

    uint8_t* getData() {
        return data_+offset_;
    }
    
    size_t getLength() {
        return length_;
    }
    // 核心方法：模拟 Buffer.slice()，创建子缓冲区视图
    Buffer slice(size_t start, size_t end = -1) {
        // 处理默认 end（默认为缓冲区末尾）
        if (end == -1) {
            end = length_;
        }

        // 参数校验与边界调整
        if (start > end) {
            throw std::invalid_argument("start must be <= end");
        }
        if (end > length_) {
            end = length_; // 超出原长度则截断到末尾
        }
        if (start > length_) {
            start = length_; // 起始位置超出则返回空缓冲区
        }

        // 计算在原始数据中的绝对偏移量（考虑当前缓冲区可能已是子视图）
        size_t absolute_offset = offset_ + start;
        size_t sub_length = end - start;

        // 创建子缓冲区视图（共享原数据，引用计数 +1）
        return Buffer(data_, absolute_offset, sub_length, ref_count_);
    }

    // 重载 [] 运算符：访问或修改指定位置的字节
    uint8_t& operator[](size_t index) {
        if (index >= length_) {
            throw std::out_of_range("index out of bounds");
        }
        // 访问原始数据中绝对偏移量的位置
        return data_[offset_ + index];
    }

    // 获取缓冲区长度
    size_t length() const {
        return length_;
    }
};

#endif //OHOS_AVRO_AVRO_COMPAREBUFFERS_H
